home *** CD-ROM | disk | FTP | other *** search
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <exec/execbase.h>
- #include <dos/dos.h>
- #include <stdlib.h>
-
- typedef signed char FLAG; /* 8-bit signed quantity (replaces BOOL) */
- typedef signed char SBYTE; /* 8-bit signed quantity (replaces Amiga BYTE) */
- typedef signed short SWORD; /* 16-bit signed quantity (replaces Amiga WORD) */
- typedef signed long SLONG; /* 32-bit signed quantity (same as LONG) */
- #define elif else if
- #define AGLOBAL ; /* global (project-scope) */
- #define MODULE static /* external static (file-scope) */
- #define PERSIST static /* internal static (function-scope) */
- #define AUTO auto /* automatic (function-scope) */
-
- #define TAB 9
- #define LF 10
- #define CR 13
-
- #define MEMMAPLINES 17
- MODULE struct
- { ULONG address;
- STRPTR description;
- } memmap[MEMMAPLINES] =
- { { 0x0000, "ROM" },
- { 0x1000, "unmapped" },
- { 0x1800, "upper screen" },
- { 0x18D0, "user RAM" },
- { 0x18F0, "hardware registers" },
- { 0x18F8, "user RAM" },
- { 0x18FC, "hardware registers" },
- { 0x1909, "unmapped" },
- { 0x1980, "hardware registers" },
- { 0x19C0, "unmapped" },
- { 0x19F8, "hardware registers" },
- { 0x1A00, "lower screen or user RAM"},
- { 0x1AD0, "user RAM" },
- { 0x1B00, "unmapped" },
- { 0x2000, "ROM" },
- { 0x8000, "modulo (>32K) access" },
- {0x10000, NULL }
- };
-
- #define EQUATESLINES 135
- MODULE STRPTR equates[EQUATESLINES] =
- {
- ";Hardware Equates/Memory Map----------------------------------------------",
- "; $0000..$0FFF: ROM (first 4K of cartridge)",
- "; $1000..$17FF: unmapped",
- "; $1800..$18CF: upper screen",
- "; $18D0..$18EF: user RAM",
- "SPRITE0Y equ $18F0",
- "SPRITE0X equ $18F1",
- "SPRITE1Y equ $18F2",
- "SPRITE1X equ $18F3",
- "SPRITE2Y equ $18F4",
- "SPRITE2X equ $18F5",
- "SPRITE3Y equ $18F6",
- "SPRITE3X equ $18F7",
- "; $18F8..$18FB: user RAM",
- "CRTCVPR equ $18FC ;crtc vertical position register",
- "PITCH equ $18FD ;also other uses",
- "; bit 7: 0 = normal mode",
- "; 1 = alternate character mode colour 2x2",
- "; bits 6..0: pitch",
- "VOLUME equ $18FE ;also other uses",
- "; bits 7..5: horizontal scanline scrolling (0..7)",
- "; bit 4: noise on/off",
- "; bit 3: tones on/off",
- "; bits 2..0: volume (0..7)",
- "CHARLINE equ $18FF ;current character line",
- "P1LEFTKEYS equ $1900",
- "; bits 7..4: unknown",
- "; bit 3: p1 (left) '1' button",
- "; bit 2: p1 (left) '4' button",
- "; bit 1: p1 (left) '7' button",
- "; bit 0: p1 (left) 'E' button (Enter)",
- "P1MIDDLEKEYS equ $1901",
- "; bits 7..4: unknown",
- "; bit 3: p1 (left) '2' button",
- "; bit 2: p1 (left) '5' button",
- "; bit 1: p1 (left) '8' button",
- "; bit 0: p1 (left) '0' button",
- "P1RIGHTKEYS equ $1902",
- "; bits 7..4: unknown",
- "; bit 3: p1 (left) '3' button",
- "; bit 2: p1 (left) '6' button",
- "; bit 1: p1 (left) '9' button",
- "; bit 0: p1 (left) 'C' button (Clear)",
- "P1PALLADIUM equ $1903",
- "; bits 7..4: unknown",
- "; bit 3: p1 (right) Palladium button #1",
- "; bit 2: p1 (right) Palladium button #2",
- "; bit 1: p1 (right) Palladium button #3",
- "; bit 0: p1 (right) Palladium button #4",
- "P2LEFTKEYS equ $1904",
- "; bits 7..4: unknown",
- "; bit 3: p2 (right) '1' button",
- "; bit 2: p2 (right) '4' button",
- "; bit 1: p2 (right) '7' button",
- "; bit 0: p2 (right) 'E' button (Enter)",
- "P2MIDDLEKEYS equ $1905",
- "; bits 7..4: unknown",
- "; bit 3: p2 (right) '2' button",
- "; bit 2: p2 (right) '5' button",
- "; bit 1: p2 (right) '8' button",
- "; bit 0: p2 (right) '0' button",
- "P2RIGHTKEYS equ $1906",
- "; bits 7..4: unknown",
- "; bit 3: p2 (right) '3' button",
- "; bit 2: p2 (right) '6' button",
- "; bit 1: p2 (right) '9' button",
- "; bit 0: p2 (right) 'C' button (Clear)",
- "P2PALLADIUM equ $1907",
- "; bits 7..4: unknown",
- "; bit 3: p2 (right) Palladium button #1",
- "; bit 2: p2 (right) Palladium button #2",
- "; bit 1: p2 (right) Palladium button #3",
- "; bit 0: p2 (right) Palladium button #4",
- "CONSOLE equ $1908",
- "; bits 7..3: unknown",
- "; bit 2: DIFFICULTY button",
- "; bit 1: OPTION button",
- "; bit 0: START button",
- "; $1909..$197F: unmapped",
- "; $1980..$1987: sprite #0",
- "; $1988..$198F: sprite #1",
- "; $1990..$1997: sprite #2",
- "; $1998..$199F: sprite #3",
- "UDC0 equ $19A0",
- "; $19A0..$19A7: user-defined character #0",
- "UDC1 equ $19A8",
- "; $19A8..$19AF: user-defined character #1",
- "UDC2 equ $19B0",
- "; $19B0..$19B7: user-defined character #2",
- "UDC3 equ $19B8",
- "; $19B8..$19BF: user-defined character #3",
- "; $19C0..$19F7: unmapped",
- "RESOLUTION equ $19F8",
- "; bit 7: 0 = normal mode",
- "; 1 = block graphics mode",
- "; bit 6: 0 = low-res mode",
- "; 1 = high-res mode",
- "; bits 5..0: rectangle descriptions in block graphics mode",
- "BGCOLOUR equ $19F9",
- "; bit 7: 0 = low-res mode",
- "; 1 = high-res mode",
- "; bit 6: paddle interpolation (switches between axes of analog sticks)",
- "; bits 5..3: colours of tile set 0",
- "; bits 2..0: background colour",
- "SPRITES23CTRL equ $19FA",
- "; bit 7: 0 = sprite #2 double-height",
- "; 1 = sprite #2 normal",
- "; bit 6: 0 = sprite #3 double-height",
- "; 1 = sprite #3 normal",
- "; bits 5..3: colours of sprite #2",
- "; bits 2..0: colours of sprite #3",
- "SPRITES01CTRL equ $19FB",
- "; bit 7: 0 = sprite #0 double-height",
- "; 1 = sprite #0 normal",
- "; bit 6: 0 = sprite #1 double-height",
- "; 1 = sprite #1 normal",
- "; bits 5..3: colours of sprite #0",
- "; bits 2..0: colours of sprite #2",
- "BGCOLLIDE equ $19FC",
- "; bits 7..4: unknown",
- "; bits 3..0: collision between sprites #3..#0 (respectively) and background",
- "SPRITECOLLIDE equ $19FD",
- "; bits 7..6: unknown",
- "; bit 5: sprites #2/#3 collision",
- "; bit 4: sprites #1/#3 collision",
- "; bit 3: sprites #1/#2 collision",
- "; bit 2: sprites #0/#3 collision",
- "; bit 1: sprites #0/#3 collision",
- "; bit 0: sprites #0/#3 collision",
- "P2PADDLE equ $19FE",
- "P1PADDLE equ $19FF",
- "; $1A00..$1ACF: lower screen",
- "; $1AD0..$1AFF: user RAM",
- "; $1B00..$1FFF: unmapped",
- "; $2000..$7FFF: ROM (last 24K of cartridge)"
- };
-
- #define REPLACEMENTS 33
- MODULE struct
- { STRPTR old, new;
- } replacement[REPLACEMENTS] =
- { {"8F0", "SPRITE0Y" },
- {"8F1", "SPRITE0X" },
- {"8F2", "SPRITE1Y" },
- {"8F3", "SPRITE1X" },
- {"8F4", "SPRITE2Y" },
- {"8F5", "SPRITE2X" },
- {"8F6", "SPRITE3Y" },
- {"8F7", "SPRITE3X" },
- {"8FC", "CRTCVPR" },
- {"8FD", "PITCH" },
- {"8FE", "VOLUME" },
- {"8FF", "CHARLINE" },
- {"900", "P1LEFTKEYS" },
- {"901", "P1MIDDLEKEYS" },
- {"902", "P1RIGHTKEYS" },
- {"903", "P1PALLADIUM" },
- {"904", "P2LEFTKEYS" },
- {"905", "P2MIDDLEKEYS" },
- {"906", "P2RIGHTKEYS" },
- {"907", "P2PALLADIUM" },
- {"908", "CONSOLE" },
- {"9A0", "UDC0" },
- {"9A8", "UDC1" },
- {"9B0", "UDC2" },
- {"9B8", "UDC3" },
- {"9F8", "RESOLUTION" },
- {"9F9", "BGCOLOUR" },
- {"9FA", "SPRITES23CTRL"},
- {"9FB", "SPRITES01CTRL"},
- {"9FC", "BGCOLLIDE" },
- {"9FD", "SPRITECOLLIDE"},
- {"9FE", "P2PADDLE" },
- {"9FF", "P1PADDLE" }
- };
-
- MODULE void rq(STRPTR message);
- MODULE void absolute(void);
- MODULE void getea(void);
- MODULE void immediate(FLAG bin, TEXT special);
- MODULE void skip(void);
- MODULE void zero(TEXT special);
- MODULE FLAG getcondition(FLAG istrue);
- MODULE void binarize(FLAG invert);
- MODULE void printlabel(void);
- MODULE void dolf(void);
- MODULE void prepare(ULONG value);
- MODULE void tellwhere(void);
-
- IMPORT struct ExecBase* SysBase;
-
- MODULE UBYTE *Buffer1 = NULL,
- *Buffer2 = NULL,
- *Buffer3 = NULL;
- MODULE ULONG ic, oc,
- level = 6,
- x;
- MODULE TEXT filename[512 + 1],
- op[7 + 1],
- r,
- where[4];
- MODULE FLAG ibm = TRUE;
-
- void main(int argc, char** argv)
- { ULONG ac, i, hc, size, tc, xx, y, yc;
- BPTR TheHandle = NULL;
- FLAG addr3,
- done,
- found,
- started;
- SLONG args[3] = {0, 0, 0};
- struct FileInfoBlock* FIBPtr = NULL;
- struct RDArgs* ArgsPtr = NULL;
- TEXT bytes;
-
- /* Start of program.
-
- version embedding into executable */
- if (0) /* that is, never */
- { printf("$VER: Annotate 1.11 (23.12.2003)");
- }
-
- if (SysBase->LibNode.lib_Version < 36L)
- { rq("Annotate: Need AmigaOS 2.0!");
- }
-
- if (argc) /* started from CLI */
- { if (!(ArgsPtr = ReadArgs
- ( "FILE/A,LEVEL/N,AMIGA/S", // all compulsory (/A) arguments must be first
- (LONG *) args,
- NULL
- )))
- { printf
- ( "Usage: %s [LEVEL=<number>] [AMIGA] [FILE=]<filename>\n",
- argv[0]
- );
- exit(EXIT_FAILURE);
- }
- // assert(args[0]);
- if (strlen(args[0]) > 512)
- { printf("%s: <filename> must be <= 512 characters!\n", argv[0]);
- FreeArgs(ArgsPtr);
- ArgsPtr = NULL;
- exit(EXIT_FAILURE);
- }
- strcpy(filename, args[0]);
- if (args[1])
- { level = (ULONG) (*((SLONG *) args[1]));
- if (level < 1 && level > 6)
- { printf("%s: <number> must be 1-6!\n", argv[0]);
- FreeArgs(ArgsPtr);
- ArgsPtr = NULL;
- exit(EXIT_FAILURE);
- } }
- if (args[2])
- { ibm = FALSE;
- } }
- else // started from WB
- { printf
- ( "Usage: %s [LEVEL=<number>] [AMIGA] [FILE=]<filename>\n",
- argv[0]
- );
- FreeArgs(ArgsPtr);
- ArgsPtr = NULL;
- exit(EXIT_FAILURE);
- }
- if (ArgsPtr)
- { FreeArgs(ArgsPtr);
- ArgsPtr = NULL;
- }
-
- // first pass --------------------------------------------------------
-
- if (!(TheHandle = (BPTR) Lock(filename, ACCESS_READ)))
- { rq("Lock() failed!");
- }
- if (!(FIBPtr = AllocDosObject(DOS_FIB, NULL)))
- { UnLock(TheHandle);
- TheHandle = NULL;
- rq("AllocDosObject() failed!");
- }
- if (!(Examine(TheHandle, FIBPtr)))
- { UnLock(TheHandle);
- TheHandle = NULL;
- rq("Examine() failed!");
- }
- UnLock(TheHandle);
- TheHandle = NULL;
- size = FIBPtr->fib_Size;
- if (FIBPtr->fib_DirEntryType != -3)
- { FreeDosObject(DOS_FIB, FIBPtr);
- FIBPtr = NULL;
- rq("Not a file!");
- }
- FreeDosObject(DOS_FIB, FIBPtr);
- FIBPtr = NULL;
-
- if (!(Buffer1 = AllocVec(size + 1, MEMF_ANY | MEMF_PUBLIC)))
- { rq("Out of memory!");
- }
- if (!(TheHandle = Open(filename, MODE_OLDFILE)))
- { rq("Open() failed!");
- }
- if (Read(TheHandle, Buffer1, size + 1) == -1)
- { Close(TheHandle);
- TheHandle = NULL;
- FreeVec(Buffer1);
- Buffer1 = NULL;
- rq("Read() failed!");
- }
- Close(TheHandle);
- TheHandle = NULL;
- Buffer1[size] = 0;
-
- /* Buffer1 is now allocated and filled. */
-
- if (!(Buffer2 = AllocVec(8192 + (size * 2), MEMF_ANY | MEMF_PUBLIC)))
- { rq("Out of memory!");
- }
-
- ic = oc = x = y = 0;
- addr3 = FALSE;
- while (ic < size)
- { if (Buffer1[ic] == TAB)
- { xx = 8 - (x % 8);
- x += xx;
- for (i = 1; i <= xx; i++)
- { Buffer2[oc++] = ' ';
- }
- ic++;
- } elif
- ( (Buffer1[ic] == 'X' && Buffer1[ic + 5] != ':')
- || (Buffer1[ic] == 'L' && Buffer1[ic + 1] == '2')
- )
- { Buffer2[oc] = '$'; // "$1234"
- Buffer2[oc + 1] = Buffer1[ic + 1]; // "$1234"
- Buffer2[oc + 2] = Buffer1[ic + 2]; // "$1234"
- Buffer2[oc + 3] = Buffer1[ic + 3]; // "$1234"
- Buffer2[oc + 4] = Buffer1[ic + 4]; // "$1234"
- ic += 5;
- oc += 5;
- x += 5;
- } elif (!strncmp(&Buffer1[ic], "00000H", 6))
- { Buffer2[oc] = '$'; // "$1234"
- Buffer2[oc + 1] = Buffer1[ic + 1]; // "$1234"
- Buffer2[oc + 2] = Buffer1[ic + 2]; // "$1234"
- Buffer2[oc + 3] = Buffer1[ic + 3]; // "$1234"
- Buffer2[oc + 4] = Buffer1[ic + 4]; // "$1234"
- ic += 6;
- oc += 5;
- x += 5;
- } elif (!strncmp(&Buffer1[ic], "\t\t;INFO: indirect jump", 22))
- { ic += 22;
- } elif (Buffer1[ic] == '0' && Buffer1[ic + 3] == 'H')
- { // change "012H" to "$12"
- Buffer2[oc] = '$';
- Buffer2[oc + 1] = Buffer1[ic + 1];
- Buffer2[oc + 2] = Buffer1[ic + 2];
- ic += 4;
- oc += 3;
- x += 3;
- } elif
- ( Buffer1[ic] == ','
- && ( Buffer1[ic + 1] == '+'
- || Buffer1[ic + 1] == '-'
- ) )
- { ic++;
- Buffer2[oc++] = Buffer1[ic++];
- x++;
- } elif (Buffer1[ic] == CR)
- { ic++;
- } elif (Buffer1[ic] == LF)
- { if (addr3)
- { Buffer2[oc++] = ',';
- Buffer2[oc++] = 'r';
- Buffer2[oc++] = '3';
- addr3 = FALSE;
- }
- Buffer2[oc++] = Buffer1[ic++];
- x = 0;
- y++;
- if (y == 16)
- { ic += 6;
- Buffer2[oc] = 0;
-
- if (level >= 3)
- { for (i = 0; i < EQUATESLINES; i++)
- { if (level >= 5 || i == 0 || equates[i][0] != ';')
- { strcat(Buffer2, equates[i]);
- dolf();
- } } }
-
- strcat(Buffer2,
- ";2650 Equates-------------------------------------------------------------\n"
- "z equ 0\n"
- "eq equ z\n"
- "p equ 1\n"
- "gt equ p\n"
- "n equ 2\n"
- "lt equ n\n"
- "un equ 3\n"
- ";-------------------------------------------------------------------------\n"
- );
-
- oc = strlen(Buffer2);
- } }
- else
- { if
- ( !strncmp(Buffer1, "bxa", 3)
- || !strncmp(Buffer2, "bsxa", 4)
- )
- { addr3 = TRUE;
- }
- Buffer2[oc++] = Buffer1[ic++];
- x++;
- } }
-
- Buffer2[oc] = 0;
- dolf();
- for (i = 0; i <= 7; i++)
- { Buffer2[oc++] = ' ';
- }
- Buffer2[oc++] = 'e';
- Buffer2[oc++] = 'n';
- Buffer2[oc++] = 'd';
- Buffer2[oc] = 0;
- dolf();
-
- FreeVec(Buffer1);
- Buffer1 = NULL;
-
- // second pass -------------------------------------------------------
-
- size = oc;
- if (!(Buffer3 = AllocVec(size * 12, MEMF_ANY | MEMF_PUBLIC)))
- { rq("Out of memory!");
- }
-
- ic = oc = 0;
-
- if (level <= 1)
- { while (ic < size)
- { if (Buffer2[ic] == LF && ibm)
- { Buffer3[oc++] = CR;
- }
- Buffer3[oc++] = Buffer2[ic++];
- }
- goto FINISH;
- }
-
- started = FALSE;
- while (ic < size)
- { tc = ic;
- x = 0;
- ac = oc;
-
- done = FALSE;
- do
- { if (Buffer2[ic] == LF)
- { done = TRUE;
- ic++;
- } elif (Buffer2[ic] == ';' && Buffer2[ic + 1] == '-')
- { started = TRUE;
- Buffer3[oc++] = Buffer2[ic++];
- x++;
- } elif
- ( started
- && level >= 3
- && Buffer2[ic] == '$'
- && Buffer2[ic + 1] == '1'
- && Buffer2[ic + 5] == LF
- )
- { found = FALSE;
- for (i = 0; i < REPLACEMENTS; i++)
- { if (!strncmp(replacement[i].old, Buffer2 + ic + 2, 3))
- { Buffer3[oc] = 0;
- strcat(Buffer3, replacement[i].new);
- ic += 5;
- oc += strlen(replacement[i].new);
- x += strlen(replacement[i].new);
- found = TRUE;
- break;
- } }
- if (!found)
- { Buffer3[oc++] = Buffer2[ic++];
- x++;
- } }
- else
- { Buffer3[oc++] = Buffer2[ic++];
- x++;
- } }
- while (!done);
- hc = ic;
- ic = tc;
-
- skip();
-
- bytes = '0';
- if (level >= 6)
- { if
- ( !strncmp(&Buffer2[ic], "adda", 4)
- || !strncmp(&Buffer2[ic], "anda", 4)
- || !strncmp(&Buffer2[ic], "bcfa", 4)
- || !strncmp(&Buffer2[ic], "bcta", 4)
- || !strncmp(&Buffer2[ic], "bdra", 4)
- || !strncmp(&Buffer2[ic], "bira", 4)
- || !strncmp(&Buffer2[ic], "brna", 4)
- || !strncmp(&Buffer2[ic], "bsfa", 4)
- || !strncmp(&Buffer2[ic], "bsna", 4)
- || !strncmp(&Buffer2[ic], "bsta", 4)
- || !strncmp(&Buffer2[ic], "bsxa", 4)
- || !strncmp(&Buffer2[ic], "bxa" , 3)
- || !strncmp(&Buffer2[ic], "coma", 4)
- || !strncmp(&Buffer2[ic], "eora", 4)
- || !strncmp(&Buffer2[ic], "iora", 4)
- || !strncmp(&Buffer2[ic], "loda", 4)
- || !strncmp(&Buffer2[ic], "stra", 4)
- || !strncmp(&Buffer2[ic], "suba", 4)
- )
- { bytes = '3';
- } elif
- ( !strncmp(&Buffer2[ic], "addi", 4)
- || !strncmp(&Buffer2[ic], "addr", 4)
- || !strncmp(&Buffer2[ic], "andi", 4)
- || !strncmp(&Buffer2[ic], "andr", 4)
- || !strncmp(&Buffer2[ic], "bcfr", 4)
- || !strncmp(&Buffer2[ic], "bctr", 4)
- || !strncmp(&Buffer2[ic], "bdrr", 4)
- || !strncmp(&Buffer2[ic], "birr", 4)
- || !strncmp(&Buffer2[ic], "brnr", 4)
- || !strncmp(&Buffer2[ic], "bsfr", 4)
- || !strncmp(&Buffer2[ic], "bsnr", 4)
- || !strncmp(&Buffer2[ic], "bstr", 4)
- || !strncmp(&Buffer2[ic], "comi", 4)
- || !strncmp(&Buffer2[ic], "comr", 4)
- || !strncmp(&Buffer2[ic], "cpsl", 4)
- || !strncmp(&Buffer2[ic], "cpsu", 4)
- || !strncmp(&Buffer2[ic], "eori", 4)
- || !strncmp(&Buffer2[ic], "eorr", 4)
- || !strncmp(&Buffer2[ic], "iori", 4)
- || !strncmp(&Buffer2[ic], "iorr", 4)
- || !strncmp(&Buffer2[ic], "lodi", 4)
- || !strncmp(&Buffer2[ic], "lodr", 4)
- || !strncmp(&Buffer2[ic], "lpsl", 4)
- || !strncmp(&Buffer2[ic], "lpsu", 4)
- || !strncmp(&Buffer2[ic], "ppsl", 4)
- || !strncmp(&Buffer2[ic], "ppsu", 4)
- || !strncmp(&Buffer2[ic], "rede", 4) // not further supported
- || !strncmp(&Buffer2[ic], "spsl", 4)
- || !strncmp(&Buffer2[ic], "spsu", 4)
- || !strncmp(&Buffer2[ic], "strr", 4)
- || !strncmp(&Buffer2[ic], "subi", 4)
- || !strncmp(&Buffer2[ic], "subr", 4)
- || !strncmp(&Buffer2[ic], "tmi" , 3)
- || !strncmp(&Buffer2[ic], "tpsl", 4)
- || !strncmp(&Buffer2[ic], "tpsu", 4)
- || !strncmp(&Buffer2[ic], "zbrr", 4)
- || !strncmp(&Buffer2[ic], "zbsr", 4)
- || !strncmp(&Buffer2[ic], "wrte", 4) // not further supported
- )
- { bytes = '2';
- } elif
- ( !strncmp(&Buffer2[ic], "addz", 4)
- || !strncmp(&Buffer2[ic], "andz", 4)
- || !strncmp(&Buffer2[ic], "comz", 4)
- || !strncmp(&Buffer2[ic], "dar" , 3)
- || !strncmp(&Buffer2[ic], "eorz", 4)
- || !strncmp(&Buffer2[ic], "halt", 4) // not further supported
- || !strncmp(&Buffer2[ic], "iorz", 4)
- || !strncmp(&Buffer2[ic], "lodz", 4)
- || !strncmp(&Buffer2[ic], "nop" , 3)
- || !strncmp(&Buffer2[ic], "redc", 4) // not further supported
- || !strncmp(&Buffer2[ic], "redd", 4) // not further supported
- || !strncmp(&Buffer2[ic], "retc", 4)
- || !strncmp(&Buffer2[ic], "rete", 4) // not further supported
- || !strncmp(&Buffer2[ic], "rrl" , 3)
- || !strncmp(&Buffer2[ic], "rrr" , 3)
- || !strncmp(&Buffer2[ic], "strz", 4)
- || !strncmp(&Buffer2[ic], "subz", 4)
- || !strncmp(&Buffer2[ic], "wrtc", 4) // not further supported
- || !strncmp(&Buffer2[ic], "wrtd", 4) // not further supported
- )
- { bytes = '1';
- } }
-
- if
- ( !strncmp(&Buffer2[ic], "anda", 4)
- || !strncmp(&Buffer2[ic], "andr", 4)
- )
- { prepare(4);
- strcpy(op, "&=");
- absolute();
- } elif (!strncmp(&Buffer2[ic], "andi", 4))
- { prepare(4);
- strcpy(op, "&=");
- immediate(TRUE, 'A');
- } elif (!strncmp(&Buffer2[ic], "andz", 4))
- { prepare(4);
- strcpy(op, "&=");
- zero('A');
- } elif
- ( !strncmp(&Buffer2[ic], "adda", 4)
- || !strncmp(&Buffer2[ic], "addr", 4)
- )
- { prepare(4);
- strcpy(op, "+=");
- absolute();
- } elif (!strncmp(&Buffer2[ic], "addi", 4))
- { prepare(4);
- strcpy(op, "+=");
- immediate(FALSE, 'D');
- } elif (!strncmp(&Buffer2[ic], "addz", 4))
- { prepare(4);
- strcpy(op, "+=");
- zero('D');
- } elif
- ( !strncmp(&Buffer2[ic], "bcfa", 4)
- || !strncmp(&Buffer2[ic], "bcfr", 4)
- )
- { prepare(4);
- getcondition(FALSE);
- strcat(Buffer3, "if ");
- strcat(Buffer3, op);
- strcat(Buffer3, " goto ");
- printlabel();
- Buffer3[oc++] = ';';
- } elif
- ( !strncmp(&Buffer2[ic], "bcta", 4)
- || !strncmp(&Buffer2[ic], "bctr", 4)
- )
- { prepare(4);
- if (getcondition(TRUE))
- { strcat(Buffer3, "if ");
- strcat(Buffer3, op);
- strcat(Buffer3, " ");
- }
- strcat(Buffer3, "goto ");
- printlabel();
- Buffer3[oc++] = ';';
- } elif
- ( !strncmp(&Buffer2[ic], "bdra", 4)
- || !strncmp(&Buffer2[ic], "bdrr", 4)
- )
- { prepare(4);
- skip();
- ic++;
- r = Buffer2[ic++];
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "if (--r");
- oc += 7;
- Buffer3[oc++] = r;
- Buffer3[oc] = 0;
- strcat(Buffer3, " != 0) goto ");
- printlabel();
- Buffer3[oc++] = ';';
- } elif
- ( !strncmp(&Buffer2[ic], "bira", 4)
- || !strncmp(&Buffer2[ic], "birr", 4)
- )
- { prepare(4);
- skip();
- ic++;
- r = Buffer2[ic++];
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "if (++r");
- oc += 7;
- Buffer3[oc++] = r;
- strcat(Buffer3, " != 0) goto ");
- printlabel();
- Buffer3[oc++] = ';';
- } elif
- ( !strncmp(&Buffer2[ic], "brna", 4)
- || !strncmp(&Buffer2[ic], "brnr", 4)
- )
- { prepare(4);
- skip();
- ic++;
- r = Buffer2[ic++];
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "if (r");
- oc += 5;
- Buffer3[oc++] = r;
- strcat(Buffer3, " != 0) goto ");
- printlabel();
- Buffer3[oc++] = ';';
- } elif
- ( !strncmp(&Buffer2[ic], "bsna", 4)
- || !strncmp(&Buffer2[ic], "bsnr", 4)
- )
- { prepare(4);
- skip();
- ic++;
- r = Buffer2[ic++];
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "if (r");
- oc += 5;
- Buffer3[oc++] = r;
- strcat(Buffer3, " != 0) goto ");
- printlabel();
- Buffer3[oc++] = ';';
- } elif
- ( !strncmp(&Buffer2[ic], "bsfa", 4)
- || !strncmp(&Buffer2[ic], "bsfr", 4)
- )
- { prepare(4);
- getcondition(FALSE);
- strcat(Buffer3, "if ");
- strcat(Buffer3, op);
- strcat(Buffer3, " gosub ");
- printlabel();
- Buffer3[oc++] = ';';
- } elif
- ( !strncmp(&Buffer2[ic], "bsta", 4)
- || !strncmp(&Buffer2[ic], "bstr", 4)
- )
- { prepare(4);
- if (getcondition(TRUE))
- { strcat(Buffer3, "if ");
- strcat(Buffer3, op);
- strcat(Buffer3, " ");
- }
- strcat(Buffer3, "gosub ");
- printlabel();
- Buffer3[oc++] = ';';
- } elif (!strncmp(&Buffer2[ic], "bsxa", 4))
- { prepare(4);
- Buffer3[oc] = 0;
- strcat(Buffer3, "gosub ");
- printlabel();
- strcat(Buffer3, " + r3;");
- oc += 6;
- } elif (!strncmp(&Buffer2[ic], "bxa", 3))
- { prepare(3);
- Buffer3[oc] = 0;
- strcat(Buffer3, "goto ");
- printlabel();
- strcat(Buffer3, " + r3;");
- oc += 6;
- } elif
- ( !strncmp(&Buffer2[ic], "coma", 4)
- || !strncmp(&Buffer2[ic], "comr", 4)
- )
- { prepare(4);
- Buffer3[oc] = 0;
- strcat(Buffer3, "compare ");
- oc += 8;
- strcpy(op, "against");
- absolute();
- } elif (!strncmp(&Buffer2[ic], "comi", 4))
- { prepare(4);
- Buffer3[oc] = 0;
- strcat(Buffer3, "compare ");
- oc += 8;
- strcpy(op, "against");
- immediate(FALSE, 'C');
- } elif (!strncmp(&Buffer2[ic], "comz", 4))
- { prepare(4);
- Buffer3[oc] = 0;
- strcat(Buffer3, "compare ");
- oc += 8;
- strcpy(op, "against");
- zero('C');
- } elif (!strncmp(&Buffer2[ic], "cpsl", 4))
- { prepare(4);
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "PSL &= ");
- oc += 7;
- binarize(TRUE);
- Buffer3[oc++] = ';';
- } elif (!strncmp(&Buffer2[ic], "cpsu", 4))
- { prepare(4);
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "PSU &= ");
- oc += 7;
- binarize(TRUE);
- Buffer3[oc++] = ';';
- } elif (!strncmp(&Buffer2[ic], "dar", 3))
- { prepare(3);
- skip();
- ic++;
- r = Buffer2[ic++];
- Buffer3[oc++] = 'r';
- Buffer3[oc++] = r;
- Buffer3[oc] = 0;
- strcat(Buffer3, " = BCD(r");
- oc += 8;
- Buffer3[oc++] = r;
- Buffer3[oc++] = ')';
- Buffer3[oc++] = ';';
- } elif
- ( !strncmp(&Buffer2[ic], "eora", 4)
- || !strncmp(&Buffer2[ic], "eorr", 4)
- )
- { prepare(4);
- strcpy(op, "^=");
- absolute();
- } elif (!strncmp(&Buffer2[ic], "eori", 4))
- { prepare(4);
- strcpy(op, "^=");
- immediate(TRUE, 'E');
- } elif (!strncmp(&Buffer2[ic], "eorz", 4))
- { prepare(4);
- strcpy(op, "^=");
- zero('E');
- } elif
- ( !strncmp(&Buffer2[ic], "iora", 4)
- || !strncmp(&Buffer2[ic], "iorr", 4)
- )
- { prepare(4);
- strcpy(op, "|=");
- absolute();
- } elif (!strncmp(&Buffer2[ic], "iori", 4))
- { prepare(4);
- strcpy(op, "|=");
- immediate(TRUE, 'I');
- } elif (!strncmp(&Buffer2[ic], "iorz", 4))
- { prepare(4);
- strcpy(op, "|=");
- zero('I');
- } elif
- ( !strncmp(&Buffer2[ic], "loda", 4)
- || !strncmp(&Buffer2[ic], "lodr", 4)
- )
- { prepare(4);
- strcpy(op, "=");
- absolute();
- } elif (!strncmp(&Buffer2[ic], "lodi", 4))
- { prepare(4);
- strcpy(op, "=");
- immediate(FALSE, 'L');
- } elif (!strncmp(&Buffer2[ic], "lodz", 4))
- { prepare(4);
- strcpy(op, "=");
- zero('L');
- } elif (!strncmp(&Buffer2[ic], "lpsl", 4))
- { prepare(4);
- Buffer3[oc] = 0;
- strcat(Buffer3, "PSL = r0;");
- oc += 9;
- } elif (!strncmp(&Buffer2[ic], "lpsu", 4))
- { prepare(4);
- Buffer3[oc] = 0;
- strcat(Buffer3, "PSU = r0;");
- oc += 9;
- } elif (!strncmp(&Buffer2[ic], "nop", 3))
- { prepare(3);
- } elif (!strncmp(&Buffer2[ic], "ppsl", 4))
- { prepare(4);
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "PSL |= ");
- oc += 7;
- binarize(FALSE);
- Buffer3[oc++] = ';';
- } elif (!strncmp(&Buffer2[ic], "ppsu", 4))
- { prepare(4);
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "PSU |= ");
- oc += 7;
- binarize(FALSE);
- Buffer3[oc++] = ';';
- } elif (!strncmp(&Buffer2[ic], "retc", 4))
- { prepare(4);
- skip();
- if (getcondition(TRUE))
- { strcat(Buffer3, "if ");
- strcat(Buffer3, op);
- strcat(Buffer3, " ");
- }
- strcat(Buffer3, "return;");
- oc += 7;
- } elif (!strncmp(&Buffer2[ic], "rrl", 3))
- { prepare(3);
- skip();
- ic++;
- r = Buffer2[ic++];
- Buffer3[oc++] = 'r';
- Buffer3[oc++] = r;
- Buffer3[oc] = 0;
- strcat(Buffer3, " <<= 1;");
- oc += 7;
- } elif (!strncmp(&Buffer2[ic], "rrr", 3))
- { prepare(3);
- skip();
- ic++;
- r = Buffer2[ic++];
- Buffer3[oc++] = 'r';
- Buffer3[oc++] = r;
- Buffer3[oc] = 0;
- strcat(Buffer3, " >>= 1;");
- oc += 7;
- } elif (!strncmp(&Buffer2[ic], "spsl", 4))
- { prepare(4);
- Buffer3[oc] = 0;
- strcat(Buffer3, "r0 = PSL;");
- oc += 9;
- } elif (!strncmp(&Buffer2[ic], "spsu", 4))
- { prepare(4);
- Buffer3[oc] = 0;
- strcat(Buffer3, "r0 = PSU;");
- oc += 9;
- } elif
- ( !strncmp(&Buffer2[ic], "stra", 4)
- || !strncmp(&Buffer2[ic], "strr", 4)
- )
- { prepare(4);
- skip();
- ic++;
- r = Buffer2[ic++];
- skip();
- getea();
- Buffer3[oc++] = ' ';
- Buffer3[oc++] = '=';
- Buffer3[oc++] = ' ';
- Buffer3[oc++] = 'r';
- Buffer3[oc++] = r;
- Buffer3[oc++] = ';';
- tellwhere();
- } elif (!strncmp(&Buffer2[ic], "strz", 4))
- { prepare(4);
- skip();
- ic++;
- r = Buffer2[ic++];
- skip();
- Buffer3[oc++] = 'r';
- Buffer3[oc++] = r;
- Buffer3[oc++] = ' ';
- Buffer3[oc++] = '=';
- Buffer3[oc++] = ' ';
- Buffer3[oc++] = 'r';
- Buffer3[oc++] = '0';
- Buffer3[oc++] = ';';
- } elif
- ( !strncmp(&Buffer2[ic], "suba", 4)
- || !strncmp(&Buffer2[ic], "subr", 4)
- )
- { prepare(4);
- strcpy(op, "-=");
- absolute();
- } elif (!strncmp(&Buffer2[ic], "subi", 4))
- { prepare(4);
- strcpy(op, "-=");
- immediate(FALSE, 'S');
- } elif (!strncmp(&Buffer2[ic], "subz", 4))
- { prepare(4);
- strcpy(op, "-=");
- zero('S');
- } elif (!strncmp(&Buffer2[ic], "tmi", 3))
- { prepare(3);
- skip();
- ic++;
- r = Buffer2[ic];
- ic++;
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "test bits ");
- oc += 10;
- binarize(FALSE);
- Buffer3[oc] = 0;
- strcat(Buffer3, " of r");
- oc += 5;
- Buffer3[oc++] = r;
- Buffer3[oc++] = ';';
- } elif (!strncmp(&Buffer2[ic], "tpsl", 4))
- { prepare(4);
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "test bits ");
- oc += 10;
- binarize(FALSE);
- Buffer3[oc] = 0;
- strcat(Buffer3, " of PSL");
- oc += 7;
- Buffer3[oc++] = ';';
- } elif (!strncmp(&Buffer2[ic], "tpsu", 4))
- { prepare(4);
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "test bits ");
- oc += 10;
- binarize(FALSE);
- Buffer3[oc] = 0;
- strcat(Buffer3, " of PSU");
- oc += 7;
- Buffer3[oc++] = ';';
- } elif (!strncmp(&Buffer2[ic], "zbrr", 4))
- { prepare(4);
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "goto ");
- oc += 5;
- printlabel();
- Buffer3[oc++] = ';';
- } elif (!strncmp(&Buffer2[ic], "zbsr", 4))
- { prepare(4);
- skip();
- Buffer3[oc] = 0;
- strcat(Buffer3, "gosub ");
- oc += 6;
- printlabel();
- Buffer3[oc++] = ';';
- }
-
- ic = hc;
- if (level >= 6 && bytes != '0')
- { yc = oc - ac;
- if (yc >= 73)
- { if (ibm)
- { Buffer3[oc++] = CR;
- }
- Buffer3[oc++] = LF;
- yc = 0;
- }
- for (i = yc + 1; i < 73; i++)
- { Buffer3[oc++] = ' ';
- }
- Buffer3[oc++] = ';';
- Buffer3[oc++] = bytes;
- }
-
- if (ibm)
- { Buffer3[oc++] = CR;
- }
- Buffer3[oc++] = LF;
- }
-
- FINISH:
- Buffer3[oc] = 0;
-
- FreeVec(Buffer2);
- Buffer2 = NULL;
-
- printf("%s", Buffer3);
- /* This only works with printf(), *not* Printf(). I would not have
- believed this if I had not seen it for myself. :-) */
-
- FreeVec(Buffer3);
- Buffer3 = NULL;
-
- exit(EXIT_SUCCESS); // end of the program. go back to DOS
- }
-
- MODULE void immediate(FLAG bin, TEXT special)
- { ULONG i;
-
- skip();
- ic++;
- r = Buffer2[ic++];
- skip();
- Buffer3[oc++] = 'r';
- Buffer3[oc++] = r;
-
- if (special == 'D' && Buffer2[ic + 1] == '0' && Buffer2[ic + 2] == '1')
- { Buffer3[oc++] = '+';
- Buffer3[oc++] = '+';
- } elif
- ( (special == 'D' && Buffer2[ic + 1] == 'F' && Buffer2[ic + 2] == 'F')
- || (special == 'S' && Buffer2[ic + 1] == '0' && Buffer2[ic + 2] == '1')
- )
- { Buffer3[oc++] = '-';
- Buffer3[oc++] = '-';
- } else
- { Buffer3[oc++] = ' ';
- Buffer3[oc] = 0;
- strcat(Buffer3, op);
- oc = strlen(Buffer3);
- Buffer3[oc++] = ' ';
- if (bin)
- { binarize(FALSE);
- } else
- { for (i = 0; i <= 2; i++)
- { Buffer3[oc++] = Buffer2[ic++];
- } } }
-
- Buffer3[oc++] = ';';
- }
- MODULE void skip(void)
- { while (Buffer2[ic] == ' ' || Buffer2[ic] == ',' || Buffer2[ic] == TAB)
- { ic++;
- } }
- MODULE void absolute(void)
- { skip();
- ic++;
- r = Buffer2[ic++];
- skip();
- Buffer3[oc++] = 'r';
- Buffer3[oc++] = r;
- Buffer3[oc++] = ' ';
- Buffer3[oc] = 0;
- strcat(Buffer3, op);
- oc = strlen(Buffer3);
- Buffer3[oc++] = ' ';
- getea();
- Buffer3[oc++] = ';';
- tellwhere();
- }
- MODULE FLAG getcondition(FLAG istrue)
- { Buffer3[oc] = 0;
- skip();
- if (!strncmp(&Buffer2[ic], "un", 2))
- { ic += 2;
- skip();
- return(FALSE);
- } elif (!strncmp(&Buffer2[ic], "eq", 2))
- { if (istrue)
- { strcpy(op, "==");
- } else
- { strcpy(op, "!=");
- }
- ic += 2;
- skip();
- return(TRUE);
- } elif (!strncmp(&Buffer2[ic], "gt", 2))
- { if (istrue)
- { strcpy(op, ">");
- } else
- { strcpy(op, "<=");
- }
- ic += 2;
- skip();
- return(TRUE);
- } elif (!strncmp(&Buffer2[ic], "lt", 2))
- { if (istrue)
- { strcpy(op, "<");
- } else
- { strcpy(op, ">=");
- }
- ic += 2;
- skip();
- return(TRUE);
- } else
- { ; // there is a problem
- return(FALSE);
- } }
- MODULE void zero(TEXT special)
- { skip();
- ic++;
- r = Buffer2[ic++];
- skip();
- Buffer3[oc++] = 'r';
- Buffer3[oc++] = '0';
- Buffer3[oc++] = ' ';
-
- if ((special == 'E' || special == 'S') && r == '0')
- { Buffer3[oc++] = '=';
- Buffer3[oc++] = ' ';
- Buffer3[oc++] = '0';
- } elif (special == 'D' && r == '0')
- { Buffer3[oc++] = '*';
- Buffer3[oc++] = '=';
- Buffer3[oc++] = ' ';
- Buffer3[oc++] = '2';
- } else
- { Buffer3[oc] = 0;
- strcat(Buffer3, op);
- oc = strlen(Buffer3);
- Buffer3[oc++] = ' ';
- Buffer3[oc++] = 'r';
- Buffer3[oc++] = r;
- }
- Buffer3[oc++] = ';';
- }
- MODULE void getea(void)
- { FLAG done, indirect;
- ULONG i;
-
- /* ic is assumed to be pointing to the start of the operand field.
- oc is assumed to be pointing past the expression, eg. "&=". */
-
- if (Buffer2[ic] == '*')
- { Buffer3[oc++] = '*';
- Buffer3[oc++] = '(';
- indirect = TRUE;
- ic++;
- } else
- { indirect = FALSE;
- }
-
- done = FALSE;
- where[0] = 0;
- if (level >= 3 && Buffer2[ic + 5] == LF)
- { for (i = 0; i < REPLACEMENTS; i++)
- { if (!strncmp(replacement[i].old, Buffer2 + ic + 2, 3))
- { Buffer3[oc] = 0;
- strcat(Buffer3, replacement[i].new);
- if (level >= 4)
- { where[0] = Buffer2[ic + 1];
- where[1] = Buffer2[ic + 2];
- where[2] = Buffer2[ic + 3];
- where[3] = Buffer2[ic + 4];
- }
- ic += 5;
- oc += strlen(replacement[i].new);
- done = TRUE;
- break;
- } } }
-
- if (!done)
- { Buffer3[oc++] = '*';
- Buffer3[oc++] = '(';
- Buffer3[oc++] = '$';
- ic++;
- if (level >= 4 && Buffer2[ic + 4] == LF)
- { for (i = 0; i <= 3; i++)
- { where[i] = Buffer2[ic + i];
- } }
- for (i = 0; i <= 3; i++)
- { Buffer3[oc++] = Buffer2[ic++];
- } }
- if (indirect)
- { Buffer3[oc++] = ')';
- }
- if (Buffer2[ic] == ',')
- { Buffer3[oc++] = ' ';
- Buffer3[oc++] = '+';
- Buffer3[oc++] = ' ';
- if (Buffer2[ic + 3] == '+')
- { Buffer3[oc++] = '+';
- Buffer3[oc++] = '+';
- } elif (Buffer2[ic + 3] == '-')
- { Buffer3[oc++] = '-';
- Buffer3[oc++] = '-';
- }
- ic++;
- Buffer3[oc++] = Buffer2[ic++];
- Buffer3[oc++] = Buffer2[ic++];
- }
- if (!done)
- { Buffer3[oc++] = ')';
- } }
- MODULE void binarize(FLAG invert)
- { UBYTE c0, c1, i, value;
-
- ic++; // pass '$'
- if (Buffer2[ic] >= '0' && Buffer2[ic] <= '9')
- { value = Buffer2[ic] - '0';
- } elif (Buffer2[ic] >= 'A' && Buffer2[ic] <= 'F')
- { value = Buffer2[ic] - 'A' + 10;
- } else value = 0;
- value *= 16;
- ic++;
- if (Buffer2[ic] >= '0' && Buffer2[ic] <= '9')
- { value += Buffer2[ic] - '0';
- } elif (toupper(Buffer2[ic]) >= 'A' && toupper(Buffer2[ic]) <= 'F')
- { value += Buffer2[ic] - 'A' + 10;
- } else value = 0;
-
- if (invert)
- { c0 = '1';
- c1 = '0';
- } else
- { c0 = '0';
- c1 = '1';
- }
-
- // write out binary value
- Buffer3[oc++] = '%';
- for (i = 128; i >= 1; i /= 2)
- { if (value >= i)
- { Buffer3[oc++] = c1;
- value -= i;
- } else Buffer3[oc++] = c0;
- }
- }
- MODULE void rq(STRPTR message)
- { printf("%s\n", message);
- exit(EXIT_FAILURE);
- }
- MODULE void printlabel(void)
- { ULONG i;
-
- // Buffer3[] is assumed to be NULL-terminated at this point
-
- if (Buffer2[ic] == '*')
- { strcat(Buffer3, "*(");
- ic++;
- }
- oc = strlen(Buffer3);
- for (i = 0; i <= 4; i++)
- { Buffer3[oc++] = Buffer2[ic++];
- }
- if (Buffer2[ic - 6] == '*')
- { Buffer3[oc++] = ')';
- }
- Buffer3[oc] = 0;
- }
- MODULE void dolf(void)
- { oc = strlen(Buffer2);
- Buffer2[oc++] = LF;
- Buffer2[oc] = 0;
- }
- MODULE void prepare(ULONG value)
- { ULONG i;
-
- if (x <= 28)
- { for (i = x + 1; i < 30; i++)
- { Buffer3[oc++] = ' ';
- } }
- else
- { if (ibm)
- { Buffer3[oc++] = CR;
- }
- Buffer3[oc++] = LF;
- for (i = 1; i < 30; i++)
- { Buffer3[oc++] = ' ';
- } }
-
- Buffer3[oc++] = ';';
- ic += value;
- }
-
- MODULE void tellwhere(void)
- { ULONG i, totalvalue, value[4];
-
- if (level >= 4 && where[0])
- { for (i = 0; i <= 3; i++)
- { if (where[i] >= '0' && where[i] <= '9')
- { value[i] = where[i] - '0';
- } else
- { value[i] = where[i] - 'A' + 10;
- } }
- totalvalue = (value[0] * 4096)
- + (value[1] * 256)
- + (value[2] * 16)
- + value[3];
-
- for (i = 0; i < MEMMAPLINES - 1; i++)
- { if (totalvalue >= memmap[i].address && totalvalue < memmap[i + 1].address)
- { Buffer3[oc++] = ' ';
- Buffer3[oc++] = '/';
- Buffer3[oc++] = '/';
- Buffer3[oc++] = ' ';
- Buffer3[oc] = 0;
- strcat(Buffer3, memmap[i].description);
- oc += strlen(memmap[i].description);
- return;
- } } } }
-